#ifndef MAIN_MODBUS_H
#define MAIN_MODBUS_H
/* 只做信号转换使用
 * 由于私有协议是在ModBus基础上进行修改的协议，在这里只需要对协议进行转换（改为无CRC校验，加上地址偏移）
 * ModBus消息输入接口，通过该模块转为内部总线信号
 * */

#ifdef __cplusplus
extern "C"{
#endif

#include <stdint.h>
#include <stddef.h>
#include <stdlib.h>
//便利访问宏


#define MB_DEFAULT_UART_BUFFER_LEN 128

//ModBus消息接收，定时发送，控制块
typedef struct ModBus_Msg_TCB ModBus_Msg_TCB;
struct ModBus_Msg_TCB{//ModBus输入输出，以及错误
    uint8_t *tx_data;//待返回的ModBus消息
    uint16_t tx_len;
    uint16_t delay;//消息延迟时间，接收消息后固定时长发送消息
    ModBus_Msg_TCB* next;//下一个任务块
};
//拓展模块描述信息块
struct PrivateBus_Slave_Descriptor{//ModBus输入输出，以及错误
    uint16_t Slave_Addr;//从机地址
    uint16_t Block0_Offset_Address;//0区偏移地址
    uint16_t Block1_Offset_Address;//1区偏移地址
    uint16_t Block3_Offset_Address;//3区偏移地址
    uint16_t Block4_Offset_Address;//4区偏移地址
    uint16_t Block0_Size;//地址大小
    uint16_t Block1_Size;//地址大小
    uint16_t Block3_Size;//地址大小
    uint16_t Block4_Size;//地址大小
};
extern uint8_t *ModBus_Uart_Tx_Ptr;

//直接调用 ModeBus_DealWith函数进行处理即可完成操作，得到串口返回值
void ModeBus_DealWith(uint8_t* _data,uint16_t _len);//串口接收消息处理函数
//
ModBus_Msg_TCB* ModBus_Slave_Creat_Send_Scheduled(uint16_t _delay);

//长度一致，所以不需要使用指针传入地址
void ModBus_To_PrivateBus(uint8_t* _data,uint16_t _len);
void PrivateBus_To_ModBus(uint8_t* _data,uint16_t _len);

void ModeBus_Send_Task(void);
#ifdef __cplusplus
};
#endif
#endif

